#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#define MAXSLEEP 128

// 指数补偿算法
int connect_retry(int domain, int type, int protocol, 
                  const struct sockaddr *addr, socklen_t alen)
{
    int numsec, fd;
    
    // 指数退避重试：1, 2, 4, 8, 16, 32, 64, 128 秒
    for (numsec = 1; numsec <= MAXSLEEP; numsec <<= 1) {
        // 创建套接字
        if ((fd = socket(domain, type, protocol)) < 0) {
            return (-1);  // 套接字创建失败，通常是系统资源问题
        }
        
        // 尝试连接
        if (connect(fd, addr, alen) == 0) {
            // 连接成功
            return (fd);
        }
        
        // 连接失败，关闭套接字
        close(fd);
        
        // 最后一次尝试后不等待
        if (numsec <= MAXSLEEP / 2) {
            sleep(numsec);
        }
    }
    
    return -1;  // 所有重试都失败
}